const express = require('express')

// 引入cookieParser
const cookieParser = require('cookie-parser')


const app = express()
app.listen(8080)


// 通过中间件生效
app.use(cookieParser())

app.get('/set',(req,res)=>{
    res.cookie('username',base64Encode('aazhangsanbb'),{ maxAge: 86400 * 1000 })


    res.send('设置成功')
})
// 获取
app.get('/get',(req,res)=>{
    let username=req.cookies.username
    if(username){
        res.send('一登录'+base64Decode(username))
    }else{
        res.send('未登录')
    }
    console.log(username);
    res.send('aaa')
})



function base64Encode(val){
	var base64hash = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
	val=encodeURIComponent(val);
    //把字符串转换为字符数组
    var strArr = val.split('');
 
    //装入结果的数组
    var result = [];
    //每个字符的ascii码
    var asciiCode;
    //上一个字符的ascii码
    var prevAsciiCode;
 
    var mod;
    //未填充之前的数组与3的模
    var preMod = strArr.length % 3;
 
    //使字符数组组成三个一组
    if(preMod == 1){
        strArr.push(null);
        strArr.push(null);
    }
    if(preMod == 2) strArr.push(null);
    //遍历整个数组，寻找每个字符的ascii码
    for(var index in strArr){
        if(!strArr[index]){
            asciiCode = 0;
        }
        else{
            asciiCode = strArr[index].charCodeAt();
        }
        //位于一组当中的第几个字符
        mod = index % 3;
        switch(mod){
            case 0:
                //往右移2位
                result.push(base64hash[asciiCode >> 2]);
                break;
            case 1:
                //上一个ascii码往左移4位与现在的ascii码往右移四位做或操作
                result.push(base64hash[(prevAsciiCode & 3) << 4 | asciiCode >> 4]);
                break;
            case 2:
				//假设当前组的ascii为：01000111,00000011,00000000
				//2表示当前索引位于第三个，第二个ascii码和15相与，获得低四位的值，右移两位后再从第三个ascii获取高二位作为新6位数的低二位
                result.push(base64hash[(prevAsciiCode & 15) << 2 | asciiCode >> 6]);
				//与2的6次方减1相与，获得低6位的值
                result.push(base64hash[asciiCode & 63]);
                break
        }
 
        prevAsciiCode = asciiCode
    }
 
    //处理异常
    if(preMod == 1) {
        result.splice(result.length - 2,2);
        result.push('==');
    }
    else if(preMod == 2) {
        result.pop();
        result.push('=');
    }
 
    return result.join('');
}
/**
 * Base64译码
 * @param val base编码后的字符串
 * @returns {string} 原字符串
 */
function base64Decode(val){
	var base64hash = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
 
    //把字符串转换为字符数组
    var strArr = val.split('');
 
    //装入结果的数组
    var result = [];
	var preCode;
	var code;
	//余数，1-3
	var n;
	for(var i in strArr){
		n=i%4;
		code=base64hash.indexOf(strArr[i]);
		switch(n){
			case 0:
				preCode=base64hash.indexOf(strArr[i]);
				break;
			case 1:
				result.push(String.fromCharCode(preCode<<2|(code&48)>>4));
				break;
			case 2:
				result.push(String.fromCharCode((preCode&15)<<4 |(code&60)>>2));
				break;
			case 3:
				result.push(String.fromCharCode(((preCode&3)<<6)|code));
				break;	
				
		}
		preCode=code;
		
	}
	
	return decodeURIComponent(result.join(''));
}
